package com.xx.ATM;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATMSystem {
    public static void main(String[] args) {
        //1.准备系统需要的容器对象，用于存储账户对象
        ArrayList<Account> accounts=new ArrayList<>();
        //2.准备系统的首页：登录，开户
        showMain(accounts);
    }

    //首页定义一个方法
    public  static void showMain(ArrayList<Account> accounts){
        System.out.println("=============欢迎进入ATM系统============");
        Scanner sc=new Scanner(System.in);
        while (true) {
            System.out.println("请输入您想要的操作：");
            System.out.println("1.登录");
            System.out.println("2.开户");
            System.out.println("您可以输入命令了：");
            int command =sc.nextInt();
            switch (command){
                case 1:
                    //登录
                    login(accounts,sc);
                    break;
                case 2:
                    //开户
                    register(accounts,sc);
                    break;
                default:
                    System.out.println("您当前输入的命令不被支持!");
            }
        }
    }

    /**
     * 用户登录功能
     * @param accounts
     * @param sc
     */
    private static void login(ArrayList<Account> accounts, Scanner sc) {
        //必须系统中存在账户才可以登录
        if(accounts.size()==0){
            System.out.println("当前系统中没有已注册账户，您需要先注册");
            return;//直接结束方法的执行
        }
        //2.让用户键盘录入卡号，根据卡号查询账户对象
        while (true) {
            System.out.println("请您输入卡号：");
            String cardId=sc.next();
            //根据卡号查询账户对象
            Account acc=getAccountByCardId(cardId,accounts);
            //3.判断账户对象是否存在，如果存在说明卡号没问题
            if(acc!=null){
                //4.用户输入密码
                while (true) {
                    System.out.println("请您输入密码：");
                    String password=sc.next();
                    //5.判断密码是否正确
                    if(acc.getPassWord().equals(password)){
                        //密码正确，登录成功
                        System.out.println("恭喜"+ acc.getUserName()+"先生/女生成功进入系统,您的卡号是："+acc.getCardId());
                        //展示系统登录后的操作界面
                        showUserCommand(sc,acc,accounts);
                        return;//继续结束登录方法，直接回到首页


                    }else{
                        System.out.println("您的密码有误，请确认！");
                    }
                }
            }else{
                System.out.println("对不起，不存在该卡号的账户！");
            }
        }
    }


    /**
     * 登录成功之后的查询账户和退出账户的功能
     * @param sc
     * @param acc
     */
    private static void showUserCommand(Scanner sc,Account acc,ArrayList<Account>accounts) {
        while (true) {
        System.out.println("============用户操作界面============");
        System.out.println("1.查询账户");
        System.out.println("2.存款");
        System.out.println("3.取款");
        System.out.println("4.转账");
        System.out.println("5.修改密码");
        System.out.println("6.退出");
        System.out.println("7.注销账户");
            System.out.println("请您输入操作命令：");
            int command=sc.nextInt();
            switch (command){
                case 1:
                    //查询账户
                    showAccount(acc);
                    break;
                case 2:
                    //存款
                    depositMoney(acc,sc);
                    break;
                case 3:
                    //取款
                    drawMoney(acc,sc);
                    break;
                case 4:
                    //转账
                    transferMoney(accounts,acc,sc);
                    break;
                case 5:
                    //修改密码
                    updatePassWord(acc,sc);
                    return;//能够直接回到主页
                case 6:
                    //退出
                    System.out.println("欢迎下次光临此系统！");
                    return;//直接退回到首页，结束当前操作的方法
                case 7:
                    //注销账户
                    //从当前账户中抹掉当前账户对象即可
                    accounts.remove(acc);
                    System.out.println("销户成功了！！！");
                    return;//直接到主页
                default:
                    System.out.println("您的命令输入有误");
            }
        }
    }

    //修改密码操作
    private static void updatePassWord(Account  acc ,Scanner sc) {
        System.out.println("==============修改密码================");
        while (true) {
            System.out.println("请您输入正确的密码：");
            String okPassWord=sc.next();
            //判断密码是否正确
            if(acc.getPassWord().equals(okPassWord)){
                while (true) {
                    //可以输入新密码了
                    System.out.println("请您输入新的密码：");
                    String newPassWord=sc.next();
                    System.out.println("请您输入确认密码：");
                    String okNewPassWord=sc.next();
                    if(newPassWord.equals(okNewPassWord)){
                        //修改账户对象的密码为新密码
                        acc.setPassWord(newPassWord);
                        return;//直接结束这个方法
                    }else{
                        System.out.println("您两次输入的密码不一致！");
                    }
                }

            }else{
                System.out.println("当前输入的密码不正确！");
            }
        }


    }

    //转账操作
    private static void transferMoney(ArrayList<Account> accounts, Account acc, Scanner sc) {
        //1.判断系统中是否有两个账户及以上
        if(accounts.size()<2){
            System.out.println("对不起，系统中无其他账户，没有可转账的人哟~");
            return;//直接退出转账方法
        }
        //2.判断自己账户中是否有钱
        if(acc.getMoney()==0){
            System.out.println("自己都没钱了还要给别人转，看来是真爱了~");
            return;
        }
        //3.开始转账逻辑
        while (true) {
            System.out.println("请您输入对方卡号：");
            String cardId=sc.next();
            Account account=getAccountByCardId(cardId,accounts);
            //判断账户对象是否存在，存在说明对方卡号输入正确
            if(account!=null){
                //进行姓氏确认
                //判断这个账户对象是否是当前登录的账户自己
                if(account.getCardId().equals(acc.getCardId())){
                    //正在给自己转账
                    System.out.println("您不可以为给自己转账哦~");
                }else{
                    //确认对方的姓氏
                    String name="*"+account.getUserName().substring(1);
                    System.out.println("请您确认"+name+"的姓氏：");
                    String preName=sc.next();
                    //判断
                    if(account.getUserName().startsWith(preName)){
                        //可以真正开始转账了
                        System.out.println("请您输入转账的金额：");
                        double money=sc.nextDouble();
                        //判断这个金额是否超过了余额
                        if(money>acc.getMoney()){
                            System.out.println("自己都没有那么多钱了，还想着转这么多啊，");
                            System.out.println("对不起，您要转账的金额太多了，您最多可以转账"+ acc.getQuotaMoney());
                        }else{
                            //真的可以转账了
                            acc.setMoney(acc.getMoney()-money);//acc是自己账户
                            account.setMoney(account.getMoney()+money);//account是对方账户
                            System.out.println("您转账成功了，已经为"+account.getUserName()+"转账"+money);
                            showAccount(acc);//查询自己账户信息
                            return;
                        }
                    }else{
                        System.out.println("对不起，您认证的信息有误~");
                    }
                }
            }else{
                System.out.println("对不起，您输入的转账卡号有问题！");
            }
        }
    }

    //取款操作
    private static void drawMoney(Account acc, Scanner sc) {
        System.out.println("=================理性用钱哦==================");
        //判断账户余额是否够100元，满足才能取钱
        if(acc.getMoney()>=100){
            while (true) {
                System.out.println("想取多少钱？记住：理性消费！");
                System.out.println("请您输入取款金额：");
                double money =sc.nextDouble();
                //判断取款金额是否超过当次取款限额
                if(money> acc.getQuotaMoney()){
                    System.out.println("超限额了，每次最多才能取"+acc.getQuotaMoney()+"元请您理性消费！");
                }else{
                    //判断当前余额是否足够取钱
                    if(acc.getMoney()>=money){
                        //够了，可以取钱了
                        acc.setMoney(acc.getMoney()-money);
                        System.out.println("恭喜您，取钱"+money+"成功了！当前账户还剩余："+acc.getMoney());
                        return;//取钱后退出取钱方
                    }else{
                        System.out.println("都没存到那么多还想用那么多,余额不足啊！");
                    }
                }
            }
        }else{
            System.out.println("100块钱都没有，先攒钱吧！");
        }
    }

    //存款操作
    private static void depositMoney(Account acc, Scanner sc) {
        System.out.println("=================存钱是个好习惯====================");
        System.out.println("请您输入存款的金额:");
        double money=sc.nextDouble();
        //直接把金额修改到账户对象的money属性中去
        acc.setMoney(acc.getMoney()+money);
        System.out.println("存款完成，离成为富婆又近了一步！");
        showAccount(acc);
    }

    //查询账户操作
    private static void showAccount(Account acc) {
        System.out.println("==============当前账户详情=================");
        System.out.println("卡号："+acc.getCardId());
        System.out.println("姓名："+acc.getUserName());
        System.out.println("余额："+acc.getMoney());
        System.out.println("当次限额："+acc.getQuotaMoney());
    }


    /**
     * 用户开户功能
     * @param accounts 账户的集合对象
     */
    private static void register(ArrayList<Account> accounts,Scanner sc) {
        //2.键盘录入姓名，密码，确认密码
        //Scanner sc=new Scanner(System.in);
        System.out.println("请您输入账户名称：");
        String name=sc.next();
        String password="";
        while (true) {
            System.out.println("请您输入账户密码：");
            password=sc.next();
            System.out.println("请您再次确认密码：");
            String okPassword=sc.next();
            //判断两次输入的密码是否一致
            if(okPassword.equals(password)){
                break;
            }else{
                System.out.println("两次密码必须一致！");
            }
        }
        System.out.println("请您账户当次限额：");
        double quotaMoney=sc.nextDouble();
        //3.随机生成8位数字账户卡号,并且不得与其他账户账号重复
        String cardId=createCardId(accounts);
        //4.创建一个账户对象封装账户信息
        //String cardId, String userName, String passWord, double money, double quotaMoney
        Account account=new Account(cardId,name,password,quotaMoney);
        //5.把账户对象添加到集合中去
        accounts.add(account);
        System.out.println("恭喜您开户成功！您的卡号是："+account.getCardId()+",请您妥善保管");

    }
    //生成卡号
    public static String createCardId(ArrayList<Account> accounts){
        //随机生成8位随机数字代表卡号
        while (true) {
            Random r=new Random();
            String cardId="";
            for (int i = 0; i <8 ; i++) {
                cardId +=r.nextInt(10);
            }
            //判断卡号是否重复
           Account acc= getAccountByCardId(cardId,accounts);
            if(acc==null){
                //说明当前卡号没有重复
                return cardId;
            }
        }
    }




    //根据卡号查询账户对象
    public static Account getAccountByCardId(String cardId,ArrayList<Account> accounts){
        for (int i = 0; i < accounts.size(); i++) {
            Account acc=accounts.get(i);
            if(acc.getCardId().equals(cardId)){
                return acc;
            }
        }
        return null;
    }











}
